
import ioClient from 'socket.io-client'
import BaseSvc from './BaseSvc'

export default class SocketSvc extends BaseSvc {

  /////////////////////////////////////////////////////////////////
  //
  //
  /////////////////////////////////////////////////////////////////
  constructor (config) {

    super (config)
  }

  /////////////////////////////////////////////////////////////////
  //
  //
  /////////////////////////////////////////////////////////////////
  name() {

    return 'SocketSvc';
  }

  /////////////////////////////////////////////////////////////////
  //
  //
  /////////////////////////////////////////////////////////////////
  get socketId() {

    return this.socket ? this.socket.id : null
  }

  ///////////////////////////////////////////////////////////////////
  // Socket Connection handler
  //
  ///////////////////////////////////////////////////////////////////
  connect() {

    return new Promise((resolve, reject) => {

      this.socket = ioClient.connect(
        `${this._config.host}:${this._config.port}`, {
          reconnect: true
        })

      this.socket.on('connect', ()=> {

        resolve(this.socket)
      })
    })
  }

  /////////////////////////////////////////////////////////////////
  //
  //
  /////////////////////////////////////////////////////////////////
  on (msgId, handler) {

    this.socket.on(msgId, (data) => {

      handler (data)
    })
  }

  ///////////////////////////////////////////////////////////////////
  //
  //
  ///////////////////////////////////////////////////////////////////
  emit(msgId, msg) {

    if(this.socket) {

      this.socket.emit(msgId, msg)
    }
  }

  ///////////////////////////////////////////////////////////////////
  //
  //
  ///////////////////////////////////////////////////////////////////
  broadcast(msgId, msg, filter = null) {

    if(this.socket) {

      this.socket.emit('broadcast', {
        filter,
        msgId,
        msg
      })
    }
  }
}